1 module hip.api.data.ini; 2 3 4 struct IniVar 5 { 6 string name; 7 string value; 8 9 pragma(inline, true) string get() => value; 10 pragma(inline, true) string opAssign(string v) () => value = v; 11 12 version(Have_util) 13 { 14 import hip.util.sumtype; 15 private Sumtype data; 16 IniVar opAssign(IniVar var){this.name = var.name; this.value = var.value; this.data = var.data; return this;} 17 18 T get(T)() 19 { 20 static if(is(T == string)) 21 return get; 22 else 23 { 24 if(data.type == Type.undefined) 25 data = Sumtype.make!T(value); 26 return data.get!T; 27 } 28 } 29 pragma(inline, true) auto opAssign(T)(T v) => data.set!T(v); 30 } 31 string toString() const @safe pure nothrow{return name~" = "~ value;} 32 } 33 34 struct IniBlock 35 { 36 string name; 37 string comment; 38 IniVar[string] vars; 39 40 string toString() const @safe pure 41 { 42 string ret = "["~name~"]\n"; 43 foreach (v; vars) 44 ret~= v.toString(); 45 return ret; 46 } 47 pragma(inline, true) auto opDispatch(string member)() => vars[member]; 48 alias vars this; 49 } 50 51 52 interface IHipIniFile 53 { 54 ref IniBlock[string] blocks(); 55 const(string[]) getErrors() const; 56 bool noError() const; 57 version(Have_util) 58 { 59 IniVar* getIniVar(string varPath); 60 T tryGet(T)(string varPath, T defaultVal = T.init) 61 { 62 IniVar* v = getIniVar(varPath); 63 if(v is null) 64 return defaultVal; 65 return v.get!T; 66 } 67 } 68 auto opDispatch(string member)() => blocks[member]; 69 }